package TecMaster;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import TecMaster.Equipamentos.Equipamento;

/**
 * Classe Agenda do projeto TecMaster. Classe responsavel pela agenda de tarefas
 * da empresa.
 * 
 * @author Flavio Ramalho
 * 
 * @version 0.2
 */

public class Agenda<E extends Equipamento> implements Serializable {
	private static final long serialVersionUID = 1L;
	private List<E> agenda;
	private final int TAMANHO_MAX_DA_AGENDA = 5;

	/**
	 * Construtor default da agenda.
	 */
	public Agenda() {
		this.agenda = new ArrayList<E>();
	}

	/**
	 * Adiciona um equipamento a agenda.
	 * 
	 * @param equipamento
	 *            o novo equipamento.
	 * @return true se adicionado, false caso o equipamento ja esteja na agenda.
	 * @throws Exception
	 *             caso a lista esteja cheia.
	 */
	public boolean addEquipamento(E equipamento) throws Exception {
		if (equipamento == null)
			throw new IllegalArgumentException();
		if (agenda.size() > TAMANHO_MAX_DA_AGENDA) {
			throw new Exception("agenda cheia");
		}
		if (agenda.contains(equipamento))
			return false;
		agenda.add(equipamento);
		return true;
	}

	/**
	 * Remove um equipamento da agenda.
	 * 
	 * @param equipamento
	 *            o equipamento a ser removido.
	 * @return true caso seja removido, false caso equipamento nao esteja na
	 *         agenda.
	 */
	public boolean removeEquipamento(E equipamento) {
		if (equipamento == null)
			throw new IllegalArgumentException();
		if (!agenda.contains(equipamento))
			return false;
		agenda.remove(equipamento);
		return true;
	}

	/**
	 * Lista todos os Equipamentos.
	 * 
	 * @return Uma List de Equipamentos.
	 */
	public List<E> listaTodosEquipamentos() {
		return agenda;
	}

	/**
	 * Retorna e remove o primeiro equipamento da fila.
	 * 
	 * @return o Equipamento ou null se nao houver nenhum equipamento.
	 */
	public E takeEquipamento() {
		if (agenda.size() > 0) {
			E primeiroEquipamento = agenda.get(0);
			agenda.remove(primeiroEquipamento);
			return primeiroEquipamento;
		}
		return null;
	}

	/**
	 * Retorna a quantiadade de dias para que o equipamento fique em 1 na fila.
	 * 
	 * @return a quantiadade de dias para que o equipamento fique em 1 na fila.
	 */
	public int getTotalDias() {
		int totalDias = 0;
		for (E equip : agenda) {
			totalDias += equip.getDiasParaConserto();
		}
		return totalDias;
	}

	/**
	 * Retorna o numero de equipamentos que estao na fila.
	 * 
	 * @return o numero de equipamentos que estao na fila.
	 */
	public int numeroDeEquipamentosNaFila() {
		return agenda.size();
	}

}
